/*
 * Copyright 2000-2020 ALPHA LAB.Inc All Rights Reserved.
 */
package com.alphalab.framework.dao;
 
import java.util.List;
import java.util.Map; 
import com.alphalab.framework.domain.BaseEntity;
import com.alphalab.framework.domain.QueryOption; 

/**
 * 通用的查询方法定义.
 * @param <PO>
 * @author allen 
 * @version 1.0.0 2017年7月17日
 */
public interface IGeneralQueryDao <PO extends BaseEntity> extends IEntityDao<PO> { 
	
	/**
	 * 根据查询条件返回分页结果集.
	 * @param queryOption 查询条件，为空则表示无条件
	 * @param pageIndex 第几页，从1开始
	 * @param pageSize 每页的记录总数
	 * @param orderBy 排序字段，为空表示默认排序
	 * @param isDesc 是否降序，为true表示降序
	 * @return List<PO>
	 */
	List<PO> findListByPageWithCondition(QueryOption queryOption, int pageIndex, int pageSize, 
			String orderBy, boolean isDesc);	
	
	/**
	 * 根据查询条件返回全部结果集.
	 * @param queryOption 查询条件，为空则表示无条件
	 * @param orderBy 排序字段，为空表示默认排序
	 * @param isDesc 是否降序，为true表示降序
	 * @return List<PO>
	 */
	List<PO> findListWithCondition(QueryOption queryOption, String orderBy, boolean isDesc);	 
	
	/**
	 * 根据hql查询返回全部结果集.
	 * @param hql hql
	 * @param conditions 查询参数键值对集合
	 * @return List<PO>
	 */
	List<PO> findByHql(String hql, Map<String, Object> conditions);	

	/**
	 * 根据hql查询返回分页结果集.
	 * @param hql hql
	 * @param conditions 查询参数键值对集合
	 * @param pageIndex 第几页，从1开始
	 * @param pageSize 每页的记录总数
	 * @return List<PO>
	 */
	List<PO> findByHql(String hql, Map<String, Object> conditions, int pageIndex, int pageSize);
	
	/**
	 * 根据原生sql查询返回全部结果集.
	 * @param sql sql
	 * @param conditions 查询条件键值对，为空则表示无条件
	 * @return List<Map>
	 */
	List<Map> findBySql(String sql, Map<String, Object> conditions);

	/**
	 * 根据原生sql查询返回分页结果集.
	 * @param sql sql
	 * @param conditions 查询条件键值对，为空则表示无条件
	 * @param pageIndex 第几页，从1开始
	 * @param pageSize 每页的记录总数
	 * @return List<Map>
	 */
	List<Map> findBySql(String sql, Map<String, Object> conditions, int pageIndex, int pageSize);
	
	/**
	 * 根据原生sql查询返回映射为实体类的结果集.
	 * @param sql sql
	 * @param conditions 查询条件键值对，为空则表示无条件
	 * @param entityType 实体类class
	 * @return List
	 */
	List findBySql(String sql, Map<String, Object> conditions, Class entityType);	
	
	/**
	 * 根据原生sql查询返回映射为实体类的分页结果集.
	 * @param sql sql
	 * @param conditions 查询条件键值对，为空则表示无条件
	 * @param entityType 实体类class
	 * @param pageIndex 第几页，从1开始
	 * @param pageSize 每页的记录总数
	 * @return List
	 */
	List findBySql(String sql, Map<String, Object> conditions, Class entityType, int pageIndex, int pageSize);	

}
